# -*- coding: utf-8 -*-
'''
Created on 09/03/2011

@author: cgaray
@contact: cdaniel.py@gmail.com.py
@summary: estructura basica de un administrador de operacions DML de una tabla
 
'''


#importamos los modulos necesarios
from TBLBase import TBLBase
from CdgPyPersistencia.bases.ConectorBase import ConectorBase


class ADMBase(object):
    '''
    estructura basica de un administrador de operacions DML de una tabla
    '''
    
    #atributos de la clase
    NOMBRE_CLASE = "ADMBase"
    
    _oTabla      = TBLBase
    _oConector   = ConectorBase
    
    _cSelect_sql = ""
    _cInsert_sql = ""
    _cUpdate_sql = ""
    _cDelete_sql = ""
    
    
    
    def __init__(self, ConectorBase):
        '''
        inicializador de la clase
        '''
        
        #asignamos los valores de atributos
        self._oConector = ConectorBase
        
        #conectamos a la base de datos
        __lResultado = self._oConector.lConectar()
        
        if __lResultado[0] != 1: print "ERROR Conectando a BD!...", __lResultado[1]
        else: print __lResultado[1]
        
    
    
    def lAgregar(self, OTDBase):
        '''anade un registro al conjunto de esta tabla'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lAgregar()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Implementado"]
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lActualizar(self, OTDBase):
        '''actualiza un registro del conjunto de esta tabla'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lActualizar()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Implementado"]
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lEliminar(self, OTDBase):
        '''elimina un registro del conjunto de esta tabla'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lEliminar()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Implementado"]
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lGet_elementos(self, cFiltroWhere = None):
        '''devuelve el diccionario de los elementos'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lGet_elementos()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Implementado"]
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def lGet_elemento(self, **kwargs):
        '''devuelve el elemento de la lista que coincide con el pasado como parametro'''
        
        NOMBRE_METODO = self.NOMBRE_CLASE + ".lGet_elemento()"
        
        #resultado por defecto
        lResultado = [0, NOMBRE_METODO + " no Implementado"]
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    
    def Get_tabla(self):
        '''
        devuelve la instancia de tabla administrada
        '''
        
        return self._oTabla
        
    
    
    def Set_tabla(self, oTBLBase):
        '''
        establece la instancia de tabla administrada
        TBLbase = instancia de la estructura de tabla a administrar
        '''
        
        self._oTabla = oTBLBase
        
        #tomamos las sentencias correspondientes
        self._cSelect_sql = oTBLBase.Select_basico()
        self._cInsert_sql = oTBLBase.Get_insert_parametros()
        self._cUpdate_sql = oTBLBase.Get_update_parametros()
        self._cDelete_sql = oTBLBase.Get_delete_basico()
        
        
    
    
    def Get_conector(self):
        '''
        devuelve una instancia del administrador de conexion a la bd
        '''
        
        return self._oConector
        
    
    
    def __str__(self):
        '''devuelve la representacion de cadena de la clase'''
        
        return "<%s: %s > " % (self.NOMBRE_CLASE, self._oTabla.NOMBRE_TABLA)
        
    
    
    def lRecrear_tablas(self):
        '''
        ejecuta los comandos de DROPING y CREATION de la tabla administrada
        '''
        
        NOMBRE_METODO = ADMBase.NOMBRE_CLASE + ".lRecrear_tablas()"
        
        lResultado = [0, NOMBRE_METODO + " No Ejecutado"]
        
        try:
            cComando = self._oTabla.Get_drop_sql().replace("TABLE", "TABLE IF EXISTS")
            print "self._oTabla._DROP_SQL", cComando 
            
            #dropeamos la tabla
            lResultado = self._oConector.lEjecutar_sentencia(cComando, {})
            
            #si se ejecuto correctamente
            if lResultado[0] == 1: lResultado = self._oConector.lEjecutar_sentencia(self._oTabla.Get_create_sql(), {}) 
            
        except BaseException, oError:
            #en caso de error
            lResultado = [-1, NOMBRE_METODO + " Error: " + str(oError)]
        
        
        #devolvemos el resultado del metodo
        return lResultado
        
    
    

#lanzador de prueba de la clase
if __name__ == "__main__":
    
    class Test(ADMBase):
        def __init__(self, conexion):
            super(Test, self).__init__(conexion)
            
            self.lAgregar("")
            
        
        
    
    tbl = TBLBase("NUEVO 2")
    
    #con = OracleUtiles("superUser", "superPass", "xxxx.xxx.xxx.xxx", 1521, "oracleXeSID")
    
    #t = Test(con)
    
    #print t.lGet_elementos("")
    
    
